package com.fzn3.day02;

import java.util.Arrays;
import java.util.Iterator;
import java.util.function.Consumer;
import java.util.stream.IntStream;

/**
 * @program: DataStructure
 * @author: fzn
 * 描述：  动态数组
 * @create: 2023/3/8 16:16
 **/
public class DynamicArray implements Iterable<Integer> {
    /**
     * 大小
     */
    private int size = 0;
    /**
     * 容量
     */
    private int capacity = 8;
    /**
     * 数组
     */
    private int[] array = {};

    // 添加到最后一个
    public void addList(int element) {
        add(size, element);
    }

    // 添加
    public void add(int index, int element) {
        // 检查 扩容
        checkAndGrow();

        if (index >= 0 && index < size) {
            System.arraycopy(array, index, array, index + 1, size - index);
        }
        array[index] = element;
        size++;
    }

    private void checkAndGrow() {
        // 检查 不够扩容
        if (size == 0) {
            array = new int[capacity];
        } else if (size == capacity) {
            capacity += capacity >> 1;
            int[] newArray = new int[capacity];
            System.arraycopy(array, 0, newArray, 0, size);
            array = newArray;
        }
    }

    // 删除
    public int remove(int index) {
        int removed = array[index];
        if (index < size - 1) {
            System.arraycopy(array, index + 1, array, index, size - index);
        }
        size--;
        return removed;
    }


    public int get(int index) {
        // [0,size)
        return array[index];
    }

    //    public void forEach(){
//        for (int i = 0; i < size; i++) {
//            System.out.print(array[i]+" ");
//        }
//        System.out.println();
//    }
    // 第一种遍历方式
    public void foreach(Consumer<Integer> consumer) {
        for (int i = 0; i < size; i++) {
            consumer.accept(array[i]);
        }
    }

    // 第二种遍历方式 迭代器
    @Override
    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            int i = 0;

            @Override
            public boolean hasNext() { // 有没有下一个元素
                return i < size;
            }

            @Override
            public Integer next() { // 返回当前元素 并移动到下一个元素
                return array[i++];
            }
        };
    }

    // 第三种遍历方式 流的形式
    public IntStream stream() {
        return IntStream.of(Arrays.copyOfRange(array, 0, size));
    }
}
